Daily Perf Improver: Set up BenchmarkDotNet for systematic benchmarking#194
Merged
Daily Perf Improver: Set up BenchmarkDotNet for systematic benchmarking#194
Conversation
## Summary This PR establishes the foundational infrastructure for systematic performance benchmarking using BenchmarkDotNet, addressing Round 1 goals from the performance improvement plan (Issue #190). ## Performance Improvements 🎯 **Foundation Established**: - **Before**: No systematic benchmarking infrastructure - **After**: Comprehensive BenchmarkDotNet setup with core benchmarks 📊 **Benchmark Coverage**: - ✅ Core operations (unfoldAsync, replicate, mapAsync, chooseAsync) - ✅ Append operations (tests for memory leak regression) - ✅ Builder patterns (tests for O(n²) regression) - ✅ Memory diagnostics enabled for all benchmarks ## Technical Implementation ### New Benchmark Project - Created tests/FSharp.Control.AsyncSeq.Benchmarks/ with proper .NET 8.0 console app setup - Separate executable project for BenchmarkDotNet requirements - Comprehensive benchmark suites targeting known performance issues ### Benchmark Categories 1. **Core Operations**: Baseline performance for fundamental operations 2. **Append Operations**: Monitor for memory leaks (Issue #35 regression detection) 3. **Builder Patterns**: Monitor for O(n²) behavior (Issue #57 regression detection) ## Validation ✅ **All existing tests pass** (175/175) ✅ **BenchmarkDotNet infrastructure validated** - successfully builds and runs ✅ **Proper memory diagnostics** enabled for detecting allocation issues ✅ **No performance regressions** introduced by infrastructure changes ## Related Issues - Addresses Round 1 foundation goal from #190 (Performance Research and Plan) - Enables future detection of regressions for Issues #35, #57, #50, #74, #95 - Establishes baseline metrics for all future performance improvements 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
20 tasks
github-actions bot
pushed a commit
that referenced
this pull request
Aug 29, 2025
## Summary This PR implements significant performance optimizations for AsyncSeq.collect, addressing Round 2 goals from the performance improvement plan (Issue #190). The optimization focuses on reducing memory allocations and improving state management efficiency for collect operations. ## Performance Improvements - 32% faster execution for many small inner sequences (0.44s vs 0.65s for 5000 elements) - Improved memory efficiency through direct mutable fields instead of ref cells - Better state management with tail-recursive loop structure - Consistent performance across various collect patterns - Maintained O(1) memory usage for streaming operations ## Technical Implementation ### Root Cause Analysis The original collect implementation had several performance issues: - Ref cell allocations for state management (let state = ref ...) - Multiple pattern matching on each MoveNext() call - Deep continuation chains from return! x.MoveNext() recursion - Heap allocations for state transitions ### Optimization Strategy Created OptimizedCollectEnumerator<'T, 'U> with: - Direct mutable fields instead of reference cells - Tail-recursive loop for better async performance - Streamlined state management without discriminated union overhead - Efficient disposal with proper resource cleanup ## Validation All existing tests pass (175/175) Performance benchmarks show measurable improvements No breaking changes - API remains identical Edge cases tested - empty sequences, exceptions, disposal, cancellation ## Related Issues - Addresses Round 2 core algorithm optimization from #190 (Performance Research and Plan) - Builds upon optimizations from merged PRs #193, #194, #196 - Contributes to "reduce per-operation allocations by 50%" goal > AI-generated content by Daily Perf Improver may contain mistakes.
This was referenced Aug 29, 2025
5 tasks
6 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR establishes the foundational infrastructure for systematic performance benchmarking using BenchmarkDotNet, addressing Round 1 goals from the performance improvement plan (Issue #190).
Performance Improvements
🎯 Foundation Established:
📊 Benchmark Coverage:
unfoldAsync,replicate,mapAsync,chooseAsync)Technical Implementation
New Benchmark Project
tests/FSharp.Control.AsyncSeq.Benchmarks/with proper .NET 8.0 console app setupBenchmark Categories
Usage
Validation
✅ All existing tests pass (175/175)
✅ BenchmarkDotNet infrastructure validated - successfully builds and runs
✅ Proper memory diagnostics enabled for detecting allocation issues
✅ No performance regressions introduced by infrastructure changes
Test Plan
dotnet test -c Releasedotnet build tests/FSharp.Control.AsyncSeq.Benchmarks -c Releasedotnet run --project tests/FSharp.Control.AsyncSeq.Benchmarks -c ReleaseRelated Issues
Commands Used
Web Searches Performed
MCP Function Calls Used
mcp__github__search_issues: Found research issue Daily Perf Improver: Research and Plan #190 and related performance issuesmcp__github__get_issue: Retrieved details for issues Memory leak when unfolding #35, Unexpected iteration performance drop when recursive loops are used. #57, Parallel sequence runs consequentially (non-parallel) #74, Lack of parallelism in AsyncSeq.cache #95mcp__github__search_pull_requests: Verified no conflicting performance PRsmcp__github__list_pull_requests: Checked for existing performance workThis establishes the critical foundation for all future performance work, enabling systematic measurement, regression detection, and optimization validation. Future performance improvements can now be measured accurately with statistical rigor using BenchmarkDotNet.
🤖 Generated with Claude Code